home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / php / pear / File / HtAccess.php < prev    next >
PHP Script  |  2004-03-24  |  11KB  |  461 lines

  1. <?php
  2. /* vim: set ts=4 sw=4: */
  3. // +----------------------------------------------------------------------+
  4. // | PHP Version 4                                                        |
  5. // +----------------------------------------------------------------------+
  6. // | Copyright (c) 1997-2003 The PHP Group                                |
  7. // +----------------------------------------------------------------------+
  8. // | This source file is subject to version 2.0 of the PHP license,       |
  9. // | that is bundled with this package in the file LICENSE, and is        |
  10. // | available at through the world-wide-web at                           |
  11. // | http://www.php.net/license/2_02.txt.                                 |
  12. // | If you did not receive a copy of the PHP license and are unable to   |
  13. // | obtain it through the world-wide-web, please send a note to          |
  14. // | license@php.net so we can mail you a copy immediately.               |
  15. // +----------------------------------------------------------------------+
  16. // | Author: Mika Tuupola <tuupola@appelsiini.net>                        |
  17. // +----------------------------------------------------------------------+
  18. //
  19. // $Id: HtAccess.php,v 1.11 2003/02/19 14:50:15 tuupola Exp $
  20. //
  21.  
  22. require_once 'PEAR.php' ;
  23.  
  24. /**
  25. * Class for manipulating .htaccess files
  26. *
  27. * A class which provided common methods to manipulate Apache / NCSA
  28. * style .htaccess files.
  29. *
  30. * Example 1 (modifying existing file):
  31. *
  32. * $h = new File_HtAccess('.htaccess');
  33. * $h->load();
  34. * $h->setRequire('valid-user');
  35. * $h->save();
  36. *
  37. * Example 2 (modifying existing file):
  38. *
  39. * $h = new File_HtAccess('.htaccess');
  40. * $h->load();
  41. * $h->addRequire('newuser');
  42. * $h->save();
  43. *
  44. * Example 3 (creating a new file):
  45. *
  46. * $params['authname']      = 'Private';
  47. * $params['authtype']      = 'Basic';
  48. * $params['authuserfile']  = '/path/to/.htpasswd';
  49. * $params['authgroupfile'] = '/path/to/.htgroup';
  50. * $params['require']       = array('group', 'admins');
  51. *
  52. * $h = new File_HtAccess('/path/to/.htaccess', $params);
  53. * $h->save();
  54. *
  55. * @author  Mika Tuupola <tuupola@appelsiini.net>
  56. * @access  public
  57. * @version 1.0.0
  58. * @package File_HtAccess
  59. * @category File
  60. */
  61.  
  62. class File_HtAccess {
  63.  
  64.     var $file;
  65.     var $authname;
  66.     var $authtype;
  67.     var $authuserfile;
  68.     var $authgroupfile;
  69.     var $authdigestfile;
  70.     var $authdigestgroupfile;
  71.     var $require    = array();
  72.     var $additional = array();
  73.  
  74.     /**
  75.     * Constructor
  76.     *
  77.     * @access public
  78.     * @param  string $file
  79.     * @param  array  $params 
  80.     * @return object File_HtAccess
  81.     */
  82.        
  83.     function File_HtAccess($file='.htaccess', $params='') {
  84.  
  85.         $this->file = $file;
  86.         $this->setProperties($params);
  87.  
  88.     }
  89.     
  90.     /**
  91.     * Load the given .htaccess file
  92.     *
  93.     * @access public
  94.     * @return mixed   true on success, PEAR_Error on failure
  95.     */
  96.  
  97.     function load() {
  98.  
  99.         $retval = true;
  100.         
  101.         $fd = @fopen($this->getFile(), 'r');
  102.         if ($fd) {
  103.             while ($buffer = fgets($fd, 4096)) {
  104.                 $buffer = trim($buffer);
  105.                 if ($buffer) {
  106.                     $data = split(' ', $buffer, 2);
  107.                     if (preg_match('/AuthName/i', $data[0])) {
  108.                        $this->setAuthName($data[1]);
  109.  
  110.                     } elseif (preg_match('/AuthType/i', $data[0])) {
  111.                        $this->setAuthType($data[1]);                
  112.                     
  113.                     } elseif (preg_match('/AuthUserFile/i', $data[0])) {
  114.                        $this->setAuthUserFile($data[1]);            
  115.                            
  116.                     } elseif (preg_match('/AuthGroupFile/i', $data[0])) {
  117.                        $this->setAuthGroupFile($data[1]);
  118.  
  119.                     } elseif (preg_match('/AuthDigestFile/i', $data[0])) {
  120.                        $this->setAuthDigestFile($data[1]);
  121.  
  122.                     } elseif (preg_match('/AuthDigestGroupFile/i', $data[0])) {
  123.                        $this->setAuthDigestGroupFile($data[1]);
  124.  
  125.                     } elseif (preg_match('/Require/i', $buffer)) {
  126.                        $require = split(' ', $data[1]);
  127.                        $this->setRequire($require);
  128.  
  129.                     } elseif (trim($buffer)) {
  130.                        $this->addAdditional($buffer);
  131.                     }
  132.                 }
  133.             }
  134.             fclose($fd);
  135.  
  136.         } else {
  137.             $retval = PEAR::raiseError('Could not open ' . $this->getFile() . 
  138.                                        ' for reading.');
  139.         }
  140.  
  141.         return($retval);
  142.  
  143.     }
  144.  
  145.     /**
  146.     * Set class properties
  147.     *
  148.     * @access public
  149.     * @param  array  $params
  150.     */
  151.  
  152.     function setProperties($params) {
  153.         if (is_array($params)) {
  154.             foreach ($params as $key => $value) {
  155.                 $method = 'set' . $key;
  156.                 $this->$method($value);
  157.             }
  158.         }
  159.     }
  160.     
  161.     /**
  162.     * Set the value of authname property
  163.     * 
  164.     * @access public
  165.     * @param  string $name
  166.     */
  167.  
  168.     function setAuthName($name='Restricted') {
  169.         $this->authname = $name;
  170.     }
  171.  
  172.     /**
  173.     * Set the value of authtype propery
  174.     *
  175.     * @access public
  176.     * @param  string $type
  177.     */
  178.  
  179.     function setAuthType($type='Basic') {
  180.         $this->authtype = $type;
  181.     }
  182.  
  183.     /**
  184.     * Set the value of authuserfile propery
  185.     *
  186.     * @access public
  187.     * @param  string $file
  188.     */
  189.  
  190.     function setAuthUserFile($file='') {
  191.         $this->authuserfile = $file;
  192.     }
  193.  
  194.     /**
  195.     * Set the value of authgroupfile property
  196.     *
  197.     * @access public
  198.     * @param  string $file
  199.     */
  200.  
  201.     function setAuthGroupFile($file='') {
  202.         $this->authgroupfile = $file;
  203.     }
  204.  
  205.     /**
  206.     * Set the value of authdigestfile property
  207.     *
  208.     * @access public
  209.     * @param  string $file
  210.     */
  211.  
  212.     function setAuthDigestFile($file='') {
  213.         $this->authdigestfile = $file;
  214.     }
  215.  
  216.     /**
  217.     * Set the value of authdigestgroupfile property
  218.     *
  219.     * @access public
  220.     * @param  string $file
  221.     */
  222.  
  223.     function setAuthDigestGroupFile($file='') {
  224.         $this->authdigestgroupfile = $file;
  225.     }
  226.  
  227.     /**
  228.     * Set the value of require property
  229.     *
  230.     * Parameter can be given as an array or string. If given as a string
  231.     * the value will be exploded in to an array by using space as a 
  232.     * separator.
  233.     *
  234.     * @access public
  235.     * @param  mixed $require
  236.     */
  237.  
  238.     function setRequire($require='') {
  239.         if (is_array($require)) {
  240.             $this->require = $require;
  241.         } else {
  242.             $this->require = explode(' ', $require);
  243.         }
  244.     }
  245.  
  246.     /**
  247.     * Add a value to require property
  248.     *
  249.     * @access public
  250.     * @param  string $require
  251.     */
  252.     function addRequire($require) {
  253.         $this->require[] = $require;
  254.     }
  255.  
  256.     /**
  257.     * Delete a value from require property
  258.     *
  259.     * @access public
  260.     * @param  string $require
  261.     */
  262.     function delRequire($require) {
  263.         $pos = array_search($require, $this->require);
  264.         unset($this->require[$pos]);
  265.     }
  266.  
  267.     /**
  268.     * Set the value of additional property
  269.     *
  270.     * Additional property is used for all the extra things in .htaccess
  271.     * file which don't have specific accessor method for them. 
  272.     *
  273.     * @access public
  274.     * @param  array  $additional
  275.     */
  276.  
  277.     function setAdditional($additional='') {
  278.         $this->additional = (array)$additional;
  279.     }
  280.  
  281.     /**
  282.     * Add a value to additional property
  283.     *
  284.     * @access public
  285.     * @param  string $additional
  286.     */
  287.  
  288.     function addAdditional($additional='') {
  289.         $this->additional[] = $additional;
  290.     }
  291.     
  292.     /**
  293.     * Set the value of file property
  294.     *
  295.     * @access public
  296.     * @param  file   $file
  297.     */
  298.  
  299.     function setFile($file) {
  300.         $this->file = $file;
  301.     }
  302.     
  303.     /**
  304.     * Get the value of authname property
  305.     *
  306.     * @access public
  307.     * @return string  
  308.     */
  309.  
  310.     function getAuthName() {
  311.         return($this->authname);
  312.     }
  313.  
  314.     /**
  315.     * Get the value of authtype property
  316.     *
  317.     * @access public
  318.     * @return string  
  319.     */
  320.  
  321.     function getAuthType() {
  322.         return($this->authtype);
  323.     }
  324.     
  325.     /**
  326.     * Get the value of authuserfile property
  327.     *
  328.     * @access public
  329.     * @return string  
  330.     */
  331.  
  332.     function getAuthUserFile() {
  333.         return($this->authuserfile);
  334.     }
  335.  
  336.     /**
  337.     * Get the value of authgroupfile property
  338.     *
  339.     * @access public
  340.     * @return string  
  341.     */
  342.  
  343.  
  344.     function getAuthGroupFile() {
  345.         return($this->authgroupfile);
  346.     }
  347.  
  348.     /**
  349.     * Get the value of authdigestfile property
  350.     *
  351.     * @access public
  352.     * @return string  
  353.     */
  354.  
  355.     function getAuthDigestFile() {
  356.         return($this->authdigestfile);
  357.     }
  358.  
  359.     /**
  360.     * Get the value of authdigestgroupfile property
  361.     *
  362.     * @access public
  363.     * @return string  
  364.     */
  365.  
  366.     function getAuthDigestGroupFile() {
  367.         return($this->authdigestgroupfile);
  368.     }
  369.  
  370.     /**
  371.     * Get the value(s) of require property
  372.     *
  373.     * @access public
  374.     * @param  string $type whether to return an array or string
  375.     * @return mixed  string or array, defaults to an array  
  376.     */
  377.  
  378.     function getRequire($type='') {
  379.         $retval = $this->require;
  380.  
  381.         if ($type == 'string') {
  382.             $retval = implode($retval, ' ');
  383.         }
  384.         return($retval);
  385.     }
  386.  
  387.     /**
  388.     * Get the value(s) of additional property
  389.     *
  390.     * @access public
  391.     * @param  string $type whether to return an array or string
  392.     * @return mixed  string or array, defaults to an array  
  393.     */
  394.  
  395.     function getAdditional($type='') {
  396.         $retval = $this->additional;
  397.  
  398.         if ($type == 'string') {
  399.             $retval = implode($retval, "\n");
  400.         }
  401.         return($retval);
  402.     }
  403.  
  404.     /**
  405.     * Get the value of file property
  406.     *
  407.     * @access public
  408.     * @return string  
  409.     */
  410.  
  411.     function getFile() {
  412.         return($this->file);
  413.     }
  414.  
  415.     /**
  416.     * Save the .htaccess file
  417.     *
  418.     * @access public
  419.     * @return mixed      true on success, PEAR_Error on failure
  420.     * @see    PEAR_Error
  421.     */
  422.  
  423.     function save() {
  424.  
  425.         $retval = true;
  426.  
  427.         $str  = 'AuthName '     . $this->getAuthName() . "\n";
  428.         $str .= 'AuthType '     . $this->getAuthType() . "\n";
  429.  
  430.         if ('basic' == strtolower($this->getAuthType())) {
  431.             $str .= 'AuthUserFile ' . $this->getAuthUserFile() . "\n";
  432.             if (trim($this->getAuthGroupFile())) {
  433.                 $str .= 'AuthGroupFile ' . $this->getAuthGroupFile() . "\n";   
  434.             }
  435.         } elseif ('digest' == strtolower($this->getAuthType())) {
  436.             $str .= 'AuthDigestFile ' . $this->getAuthDigestFile() . "\n";
  437.             if (trim($this->getAuthDigestGroupFile())) {
  438.                 $str .= 'AuthDigestGroupFile ' . $this->getAuthDigestGroupFile() . "\n";   
  439.             }
  440.         }
  441.  
  442.         $str .= 'Require ' . $this->getRequire('string') . "\n";
  443.         $str .= $this->getAdditional('string') . "\n";
  444.         
  445.         $fd = @fopen($this->getFile(), 'w');
  446.         if ($fd) {
  447.             fwrite($fd, $str, strlen($str));
  448.         } else {
  449.             $retval = PEAR::raiseError('Could not open ' . $this->getFile() . 
  450.                                        ' for writing.');
  451.  
  452.         }
  453.  
  454.         return($retval);
  455.         
  456.     }
  457.  
  458. }
  459.  
  460. ?>
  461.